Technical Q&A QA1139
Retrieving Data from AEDesc Records - do not use the dataHandle field


Q: ÉAÉbÉvÉãÉCÉxÉìÉgÉfÉBÉXÉNÉäÉvÉ^ÉåÉRÅ[ÉhÇ…ï€ë∂Ç≥ÇÍǃǢÇÈÉfÅ[É^ÇÕÇ«ÇÃÇÊǧDžǵǃéÊÇËèoÇπÇŒÇÊÇ¢Ç≈ǵÇÂǧǩÅH

A: Carbon Çà Apple Event Manager API ÇégǡǃÅAÉÅÉÇÉäÇ…íºê⁄ÉAÉNÉZÉXǵÅAÉAÉbÉvÉãÉCÉxÉìÉgÉfÉBÉXÉNÉäÉvÉ^ÉåÉRÅ[ÉhÇ…ä÷òAïtÇØÇÁÇÍǃǢÇÈÉfÅ[É^ÇéÊÇËèoÇ∑DZÇΔÇÕÇ≈Ç´Ç‹ÇπÇÒÅBÉAÉbÉvÉãÇ≈ÇÕÅAAEDesc ç\ë¢ëÃÇ…ï€ë∂Ç≥ÇÍǃǢÇÈÉfÅ[É^ÇÃÉRÉsÅ[ÇéÊìæÇ∑ÇÈÇΩÇflÇÃÅA2 ǬÇà Carbon ÉAÉNÉZÉbÉT API (AEGetDescDataSize ÇΔ AEGetDescDataÅjÇíÒãüǵǃǢNjÇ∑ÅBDZÇÍÇÁ 2 ǬÇà API ÇÃìKêÿÇ»égópï˚ñ@DžǬǢǃÇÕÅAÉäÉXÉg 1 Ç…é¶ÇµÇ‹Ç∑ÅB



ÉäÉXÉg 1. AEGetDescDataSize ÇΔ AEGetDescData Çégópǵǃ AEDesc ÉåÉRÅ[ÉhÇ…ï€ë∂Ç≥ÇÍǃǢÇÈÉfÅ[É^ÇÃÉRÉsÅ[ÇéÊìæ

Ptr theData;
Size theLength;
AEDesc theDesc;
OSStatus err;

    ....

    /* ÉfÉBÉXÉNÉäÉvÉ^ÉåÉRÅ[ÉhÇ…ï€ë∂Ç≥ÇÍǃǢÇÈ
    ÉfÅ[É^ÇÃí∑Ç≥Çí≤Ç◊ÇÈ */
theLength = AEGetDescDataSize(&theDesc);

    /* ÉfÅ[É^ÇÃÉRÉsÅ[Çï€éùÇ∑ÇÈÇΩÇflÇÃÉoÉbÉtÉ@ÇäÑÇËìñǃÇÈ*/
theData = malloc(theLength);
if (theData != NULL) {

        /* ÉfÅ[É^ÇÉoÉbÉtÉ@Ç…ÉRÉsÅ[Ç∑ÇÈ */
    err = AEGetDescData(theDesc, theData, theLength);
    if ( err == noErr) {

        /* éÊìæÇµÇΩÉfÅ[É^Ç≈âΩÇÁÇ©ÇÃëÄçÏÇé¿çsÇ∑ÇÈ*/

        ....


AEDesc ÉåÉRÅ[ÉhÇ…ï€ë∂Ç≥ÇÍǃǢÇÈÉfÅ[É^ÇïœçXÇ∑ÇÈÇΩÇflÇ…ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìDžǮǢǃ AEReplaceDescData ÉãÅ[É`ÉìÇégǧDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB



èdóvÅF
AEGetDescData ÉãÅ[É`ÉìÅAAEGetDescDataSize ÉãÅ[É`ÉìÇ®ÇÊÇ—ÅA AEReplaceDescData ÉãÅ[É`ÉìÇÕÅAíPèÉÇ»ílÇï€ë∂Ç∑ÇÈÉfÉBÉXÉNÉäÉvÉ^Ç…ÇÃÇ›égópÇ≈Ç´Ç‹Ç∑ÅBAppleEvent ÉåÉRÅ[ÉhÅAAERecord ÉåÉRÅ[ÉhÅA Ç®ÇÊÇ— AEDescList ÉåÉRÅ[ÉhÇÃÇÊǧǻï°çáå^ÇÃÉfÉBÉXÉNÉäÉvÉ^ÉåÉRÅ[ÉhÇ…ÇÕégǶNjÇπÇÒÅBï°çáå^ÇÃÉfÉBÉXÉNÉäÉvÉ^ÉåÉRÅ[ÉhDžDZÇÍÇÁÇÃÉãÅ[É`ÉìÇégǮǧÇΔÇ∑ÇÍÇŒÅAó\ä˙ǵǻǢåãâ Ç™ê∂Ç∂ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉNÉâÉbÉVÉÖÇ∑ÇÈèÍçáǙdžÇËÇ‹Ç∑ÅB



îwåiíméØ

AEDesc ç\ë¢ëÃÇ…ÇÕÅAÉfÉBÉXÉNÉäÉvÉ^å^ÉtÉBÅ[ÉãÉhÇΔÉfÅ[É^ÉtÉBÅ[ÉãÉhÇà 2 ǬÇÃÉRÉìÉ|Å[ÉlÉìÉgÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅBÉfÉBÉXÉNÉäÉvÉ^å^ÉtÉBÅ[ÉãÉhÇ…ÇÕÅAÉfÉBÉXÉNÉäÉvÉ^ÉåÉRÅ[ÉhÇ…ï€ë∂Ç≥ÇÍǃǢÇÈÉfÅ[É^ÇÃå^ÇéØï Ç∑ÇÈ 32 ÉrÉbÉgÇÃÉRÅ[ÉhÅi4 ï∂éöÇà ASCII ï∂éöÇÃèÍçáÇ™ëΩÇ¢ÅjÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅBÉfÅ[É^ÉtÉBÅ[ÉãÉhÇÕÅAÉfÉBÉXÉNÉäÉvÉ^ÉåÉRÅ[ÉhÇΔä÷òAïtÇØÇÁÇÍǃǢÇÈÉfÅ[É^Ç÷ÇÃéQèΔÇï€ë∂Ç∑ÇÈÇΩÇflÇ…ÅAApple Event Manager Ç…ÇÊÇËÉVÉXÉeÉÄì‡ïîÇ≈égópÇ≥ÇÍÇ‹Ç∑ÅB ÉäÉXÉg 2 ÇÕ AEDesc ç\ë¢ëÃÇÃêÈåæÇé¶ÇµÇ‹Ç∑ÅB



ÉäÉXÉg 2Å@AEDesc ç\ë¢ëÃÇÃêÈåæ

typedef AEDataStorageType *AEDataStorage;

struct AEDesc {
    DescType       descriptorType; /* ÉfÅ[É^å^ÉtÉBÅ[ÉãÉh */
    AEDataStorage  dataHandle;     /* ÉfÅ[É^ÉtÉBÅ[ÉãÉh */
};


Mac OS X ÇÊÇËëOÇÃÉoÅ[ÉWÉáÉìÇà Mac OS Ç…Ç®ÇØÇÈ Apple Event Manager ÇÃé¿ëïÇ≈ÇÕÅAAEDesc Ç…ä÷òAïtÇØÇÁÇÍǃǢÇÈèÓïÒÇ Carbon Memory Manager HandleÇ™éQèΔÇ∑ÇÈÉÅÉÇÉäÉuÉçÉbÉNÇ…ï€ë∂Ç∑ÇÈÇΩÇflÇ… dataHandle ÉtÉBÅ[ÉãÉhÇégǡǃǢNjǵÇΩÅBǵǩǵÅACarbon API ÇΔ Mac OS X ÇÃìoèÍÇ≈ÅAAEDesc Çà dataHandle ÉtÉBÅ[ÉãÉhÇÕÅAïsìßâflÇÃÉ|ÉCÉìÉ^å^Ç…ïœçXÇ≥ÇÍNjǵÇΩÅBDZÇÃïœçXÇ…î∫Ç¢ÅAÉ\ÉtÉgÉEÉFÉAǙDZÇÃÉtÉBÅ[ÉãÉhÇÃíÜêgDžǬǢǃâΩÇÁÇ©ÇÃâºíËÇÇ∑ÇÈÇÃÇÕïsìKêÿÇΔÇ»ÇËNjǵÇΩÅB



åxçêÅF
AEDesc ç\ë¢ëÃÇà dataHandle ÉtÉBÅ[ÉãÉhÇ…ï€ë∂Ç≥ÇÍǃǢÇÈílÇégǡǃǢÇÈÅAdžÇÈÇ¢ÇÕ dataHandle ÉtÉBÅ[ÉãÉhÇ… Carbon Memory Manager Handle Ç™ä‹Ç‹ÇÍǃǢÇÈDZÇΔÇâºíËÇ∑ÇÈÉRÅ[ÉhÇÕÅAåªç›ÉTÉ|Å[ÉgÇ≥ÇÍǃǮÇÁÇ∏ÅAÇ‹ÇΩ Mac OS X Ç…Ç®ÇØÇÈ Apple Event Manager ÇÃç°å„ÇÃé¿ëïÇ≈ÇÕã@î\ǵǻǢǩLJǵÇÍÇ‹ÇπÇÒÅB



AEDesc ç\ë¢ëÃé©ëÃÇÕïsìßâflÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBǵÇΩǙǡǃÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÉ\ÉtÉgÉEÉFÉAÇ™ÅAAEDesc ÉåÉRÅ[ÉhÇ…ï€ë∂Ç≥ÇÍǃǢÇÈÉfÅ[É^å^ÇämÇ©ÇflÇÈÇΩÇflÇ… descriptorType ÉtÉBÅ[ÉãÉhÇ…ÉAÉNÉZÉXÇ∑ÇÈDZÇΔÇÕâ¬î\Ç≈Ç∑ÅB ǵǩǵÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAdataHandle ÉtÉBÅ[ÉãÉhÇ…ï€ë∂Ç≥ÇÍǃǢÇÈílÇÃà”ñ°Ç…ǬǢǃâΩÇÁÇ©ÇÃâºíËÇÇ∑ÇÈÇ◊Ç´Ç≈ÇÕdžÇËÇ‹ÇπÇÒÅBç≈çÇÇÃåãâ ÇìæÇÈÇ…ÇÕÅAÉäÉXÉg 3 Ç…é¶Ç∑ÇÊǧDžÅAdataHandle ÉtÉBÅ[ÉãÉhÇÃì‡óeÇ…àÀë∂ǵǻǢÅAì‡óeDžǬǢǃâºíËǵǻǢÉRÅ[ÉhÇç\ízÇ∑Ç◊Ç´Ç≈Ç∑ÅB



ÉäÉXÉg 3 AEDesc ÉåÉRÅ[ÉhÇà dataHandle ÉtÉBÅ[ÉãÉhÇ…ï€ë∂Ç≥ÇÍǃǢÇÈílÇégÇÌǻǢÉRÅ[ÉhÇÃç\ízó·

    AEDesc theDesc;
    char* p = "Hello World";

        /* ÉfÉBÉXÉNÉäÉvÉ^ÇçÏê¨Ç∑ÇÈ */
    err = AECreateDesc(typeChar, p, strlen(p), &theDesc);
    if (err == noErr) {

        /* çÏê¨ÇµÇΩÉfÉBÉXÉNÉäÉvÉ^ÇégǡǃâΩÇÁÇ©ÇÃëÄçÏÇé¿çsÇ∑ÇÈ */

            /* ÉfÉBÉXÉNÉäÉvÉ^ÇçÌèúÇ∑ÇÈ */
        AEDisposeDesc(&theDesc);
    }


ÉãÅ[ÉãÇÃó·äO

AEDesc ÉåÉRÅ[ÉhÇ…ä÷òAïtÇØÇÁÇÍǃǢÇÈÉfÅ[É^ǙdžÇÈǩǫǧǩÇämÇ©ÇflÇÈÇΩÇflÇ…ÅAÉäÉXÉg 4 Ç…é¶Ç∑ÇÊǧDžÅAÉRÅ[ÉhDžǮǢǃÅAdataHandle ÉtÉBÅ[ÉãÉhÇ NULL ÇΔî‰ärÇ∑ÇÈÇÃÇÕç\ǢNjÇπÇÒÅBǵǩǵÅAǪÇÃëºÇÃå`Ç≈ dataHandle ÉtÉBÅ[ ÉãÉhÇégǡǃLJà”ñ°ÇÕdžÇËÇ‹ÇπÇÒÅB



ÉäÉXÉg 4Å@AEDesc ÉåÉRÅ[ÉhÇà dataHandle ÉtÉBÅ[ÉãÉhDžǬǢǃà¿ëSÇ»âºíËÇǵÇΩÉRÅ[ÉhÇÃó·

AEDesc d = { typeNull, NULL };  // êVǵǢãÛÇÃÉfÉBÉXÉNÉäÉvÉ^Çèâä˙âªÇ∑ÇÈ

if (d.dataHandle != NULL)  // ÉfÉBÉXÉNÉäÉvÉ^Ç™ãÛÇ≈ǻǢǩǫǧǩÇí≤Ç◊ÇÈïâíSÇÃåyÇ¢É`ÉFÉbÉN



[2002 îN 4 åé 10 ì˙]